import requests
import pandas as pd
from datetime import datetime, timedelta
import plotly.graph_objects as go
import warnings
warnings.filterwarnings("ignore")
# تنظیمات
symbol = 'BTCIRT' # نماد بیتکوین به ریال
resolution = '240' # 4 ساعت (240 دقیقه)
to_date = datetime.now()# دریافت و نمایش دادههای بیتکوین به ریال از API نوبیتکس
from_date = to_date - timedelta(days=30) # دریافت دادههای ۳۰ روز گذشته
# تبدیل تاریخ به timestamp
to_timestamp = int(to_date.timestamp())
from_timestamp = int(from_date.timestamp())
# درخواست به API نوبیتکس
url = 'https://api.nobitex.ir/market/udf/history'
params = {
'symbol': symbol,
'resolution': resolution,
'from': from_timestamp,
'to': to_timestamp
}
response = requests.get(url, params=params)
data = response.json()
# بررسی وضعیت پاسخ
if data['s'] == 'ok':
# ساخت DataFrame
df = pd.DataFrame({
'timestamp': data['t'],
'open': data['o'],
'high': data['h'],
'low': data['l'],
'close': data['c'],
'volume': data['v']
})
# تبدیل timestamp به datetime
df['timestamp'] = pd.to_datetime(df['timestamp'], unit='s')
# نمایش دادههای اولیه
print(df.head())
# رسم نمودار با Plotly
fig = go.Figure(data=[
go.Candlestick(
x=df['timestamp'],
open=df['open'],
high=df['high'],
low=df['low'],
close=df['close'],
name='BTC/IRT'
)
])
# تنظیمات نمودار
fig.update_layout(
title='Bitcoin to Rial (4-hour timeframe)',
xaxis_title='Date',
yaxis_title='Price (IRR)',
xaxis_rangeslider_visible=False,
template='plotly_dark'
)
# نمایش نمودار
fig.show()
else:
print('خطا در دریافت دادهها:', data.get('errmsg', 'نامشخص'))
C:\Users\Administrator\Downloads\Programs\WPy64-31050\python-3.10.5.amd64\lib\site-packages\pandas\core\computation\expressions.py:21: UserWarning: Pandas requires version '2.8.4' or newer of 'numexpr' (version '2.8.3' currently installed). from pandas.core.computation.check import NUMEXPR_INSTALLED C:\Users\Administrator\Downloads\Programs\WPy64-31050\python-3.10.5.amd64\lib\site-packages\pandas\core\arrays\masked.py:60: UserWarning: Pandas requires version '1.3.6' or newer of 'bottleneck' (version '1.3.4' currently installed). from pandas.core import (
timestamp open high low close \
0 2024-11-28 08:30:00 6.652067e+09 6.720000e+09 6.645049e+09 6.711000e+09
1 2024-11-28 12:30:00 6.711000e+09 6.727000e+09 6.650800e+09 6.651000e+09
2 2024-11-28 16:30:00 6.650800e+09 6.679000e+09 6.650000e+09 6.652183e+09
3 2024-11-28 20:30:00 6.652183e+09 6.710000e+09 6.640000e+09 6.685004e+09
4 2024-11-29 00:30:00 6.690000e+09 6.740000e+09 6.680000e+09 6.706000e+09
volume
0 2.256661
1 2.952102
2 2.478889
3 1.821875
4 1.167876
import requests
import pandas as pd
from datetime import datetime, timedelta
import plotly.graph_objects as go
import warnings
warnings.filterwarnings("ignore")
# تنظیمات
symbol = 'BTCIRT' # نماد بیتکوین به ریال
resolution = '360' # 8 ساعت (480 دقیقه)
to_date = datetime.now()
from_date = to_date - timedelta(days=365) # دریافت دادههای ۳۰ روز گذشته
# تبدیل تاریخ به timestamp
to_timestamp = int(to_date.timestamp())
from_timestamp = int(from_date.timestamp())
# درخواست به API نوبیتکس
url = 'https://api.nobitex.ir/market/udf/history'
params = {
'symbol': symbol,
'resolution': resolution,
'from': from_timestamp,
'to': to_timestamp
}
response = requests.get(url, params=params)
data = response.json()
# بررسی وضعیت پاسخ
if data['s'] == 'ok':
# ساخت DataFrame
df = pd.DataFrame({
'timestamp': data['t'],
'open': data['o'],
'high': data['h'],
'low': data['l'],
'close': data['c'],
'volume': data['v']
})
# تبدیل timestamp به datetime
df['timestamp'] = pd.to_datetime(df['timestamp'], unit='s')
# محاسبه EMA
ema_period = 20 # دوره زمانی EMA (20 کندل)
df['ema'] = df['close'].ewm(span=ema_period, adjust=False).mean()
# بکتست استراتژی
df['position'] = 0 # پوزیشنهای معاملاتی: 1 = لانگ، -1 = شورت، 0 = بدون معامله
df.loc[df['close'] > df['ema'], 'position'] = 1 # لانگ
df.loc[df['close'] < df['ema'], 'position'] = -1 # شورت
# محاسبه تغییرات سود و زیان
df['returns'] = df['close'].pct_change()
df['strategy_returns'] = df['position'].shift(1) * df['returns'] # تغییرات سود استراتژی
# محاسبه بازدهی نهایی
cumulative_strategy_returns = (1 + df['strategy_returns']).cumprod()
# نمایش دادههای اولیه
print(df[['timestamp', 'close', 'ema', 'position', 'strategy_returns']].head())
# رسم نمودار کندلاستیک با EMA
fig = go.Figure()
# اضافه کردن نمودار کندلاستیک
fig.add_trace(go.Candlestick(
x=df['timestamp'],
open=df['open'],
high=df['high'],
low=df['low'],
close=df['close'],
name='BTC/IRT'
))
# اضافه کردن EMA
fig.add_trace(go.Scatter(
x=df['timestamp'],
y=df['ema'],
mode='lines',
name='EMA',
line=dict(color='blue', width=2)
))
# تنظیمات نمودار
fig.update_layout(
title='Bitcoin to Rial (EMA Strategy)',
xaxis_title='Date',
yaxis_title='Price (IRR)',
xaxis_rangeslider_visible=False,
template='plotly_dark'
)
# نمایش نمودار
fig.show()
else:
print('خطا در دریافت دادهها:', data.get('errmsg', 'نامشخص'))
timestamp close ema position strategy_returns 0 2023-12-29 08:30:00 2.170891e+09 2.170891e+09 0 NaN 1 2023-12-29 14:30:00 2.154000e+09 2.169282e+09 -1 -0.000000 2 2023-12-29 20:30:00 2.151500e+09 2.167589e+09 -1 0.001161 3 2023-12-30 02:30:00 2.133990e+09 2.164389e+09 -1 0.008138 4 2023-12-30 08:30:00 2.147980e+09 2.162826e+09 -1 -0.006556
این کد دادههای تاریخی بیتکوین به ریال (BTC/IRT) را از API نوبیتکس دریافت کرده و دو میانگین متحرک نمایی (EMA) سریع و کند را محاسبه میکند. سپس بر اساس شرایط مختلف، استراتژیهای Trend Following و Mean Reversion اعمال شده و سود استراتژی محاسبه و نمایش داده میشود.
---/market/udf/history) برای دریافت دادهها.timestampopenhighlowclosevolumeimport requests
import pandas as pd
from datetime import datetime, timedelta
import plotly.graph_objects as go
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings("ignore")
# Settings
symbol = 'BTCIRT'
resolution = '360' # 8-hour timeframe
to_date = datetime.now()
from_date = to_date - timedelta(days=365) # 30 days of data
# Convert timestamps
to_timestamp = int(to_date.timestamp())
from_timestamp = int(from_date.timestamp())
# Request data from Nobitex
url = 'https://api.nobitex.ir/market/udf/history'
params = {
'symbol': symbol,
'resolution': resolution,
'from': from_timestamp,
'to': to_timestamp
}
response = requests.get(url, params=params)
data = response.json()
# Validate response
if data['s'] == 'ok':
# Create DataFrame
df = pd.DataFrame({
'timestamp': data['t'],
'open': data['o'],
'high': data['h'],
'low': data['l'],
'close': data['c'],
'volume': data['v']
})
# Convert timestamp to datetime
df['timestamp'] = pd.to_datetime(df['timestamp'], unit='s')
# Compute EMA
fast_ema_period = 10
slow_ema_period = 30
df['fast_ema'] = df['close'].ewm(span=fast_ema_period, adjust=False).mean()
df['slow_ema'] = df['close'].ewm(span=slow_ema_period, adjust=False).mean()
# Implement strategy logic
df['position'] = 0 # Initial position
# Trend-following conditions
df.loc[(df['close'] > df['fast_ema']) & (df['fast_ema'] > df['slow_ema']), 'position'] = 1 # Open long trend-following
df.loc[(df['close'] < df['fast_ema']) & (df['fast_ema'] > df['slow_ema']), 'position'] = -1 # Close long, open short
# Mean-reversion conditions
df.loc[(df['close'] > df['fast_ema']) & (df['fast_ema'] < df['slow_ema']), 'position'] = 1 # Open long mean-reversion
df.loc[(df['close'] < df['fast_ema']) & (df['fast_ema'] < df['slow_ema']), 'position'] = -1 # Close long mean-reversion
# Calculate returns
df['returns'] = df['close'].pct_change()
df['strategy_returns'] = df['position'].shift(1) * df['returns']
# Calculate cumulative returns
df['cumulative_strategy_returns'] = (1 + df['strategy_returns']).cumprod()
# Plot price with EMA and signals
fig = go.Figure()
# Candlestick chart
fig.add_trace(go.Candlestick(
x=df['timestamp'],
open=df['open'],
high=df['high'],
low=df['low'],
close=df['close'],
name='Price'
))
# Fast EMA
fig.add_trace(go.Scatter(
x=df['timestamp'],
y=df['fast_ema'],
mode='lines',
name='Fast EMA',
line=dict(color='blue', width=2)
))
# Slow EMA
fig.add_trace(go.Scatter(
x=df['timestamp'],
y=df['slow_ema'],
mode='lines',
name='Slow EMA',
line=dict(color='red', width=2)
))
# Chart settings
fig.update_layout(
title='Bitcoin to Rial with Dual EMA Strategy',
xaxis_title='Date',
yaxis_title='Price (IRR)',
xaxis_rangeslider_visible=False,
template='plotly_dark'
)
fig.show()
# Plot cumulative strategy returns
plt.figure(figsize=(10, 5))
plt.plot(df['timestamp'], df['cumulative_strategy_returns'], label='Strategy Returns', color='green')
plt.xlabel('Date')
plt.ylabel('Cumulative Returns')
plt.title('Cumulative Strategy Returns')
plt.legend()
plt.grid()
plt.show()
# Calculate trade P&Ls
df['trade_pnl'] = df['strategy_returns'].dropna()
# Plot distribution of trade P&Ls
plt.figure(figsize=(10, 5))
plt.hist(df['trade_pnl'], bins=30, color='blue', alpha=0.7, edgecolor='black')
plt.xlabel('Trade P&L')
plt.ylabel('Frequency')
plt.title('Distribution of Trade P&Ls')
plt.grid()
plt.show()
else:
print('Error in fetching data:', data.get('errmsg', 'Unknown error'))
/market/udf/history) برای دریافت دادهها.timestamp: زمانopen: قیمت آغازینhigh: بالاترین قیمتlow: پایینترین قیمتclose: قیمت پایانیvolume: حجم معاملاتimport requests
import pandas as pd
from datetime import datetime, timedelta
import plotly.graph_objects as go
import warnings
warnings.filterwarnings("ignore")
# تنظیمات
symbol = 'BTCIRT'
resolution = '360' # 8 ساعت
to_date = datetime.now()
from_date = to_date - timedelta(days=365) # ۳۰ روز گذشته
# تبدیل تاریخ به timestamp
to_timestamp = int(to_date.timestamp())
from_timestamp = int(from_date.timestamp())
# درخواست داده از نوبیتکس
url = 'https://api.nobitex.ir/market/udf/history'
params = {
'symbol': symbol,
'resolution': resolution,
'from': from_timestamp,
'to': to_timestamp
}
response = requests.get(url, params=params)
data = response.json()
if data['s'] == 'ok':
# ساخت DataFrame
df = pd.DataFrame({
'timestamp': data['t'],
'open': data['o'],
'high': data['h'],
'low': data['l'],
'close': data['c'],
'volume': data['v']
})
# تبدیل timestamp به datetime
df['timestamp'] = pd.to_datetime(df['timestamp'], unit='s')
# محاسبه EMA
fast_ema_period = 10
slow_ema_period = 30
df['fast_ema'] = df['close'].ewm(span=fast_ema_period, adjust=False).mean()
df['slow_ema'] = df['close'].ewm(span=slow_ema_period, adjust=False).mean()
# تعریف موقعیتها (پوزیشنها)
df['position'] = 0
# استراتژی روند
df.loc[(df['close'] > df['fast_ema']) & (df['fast_ema'] > df['slow_ema']), 'position'] = 1 # ورود به لانگ
df.loc[(df['close'] < df['fast_ema']) & (df['fast_ema'] > df['slow_ema']), 'position'] = -1 # خروج از لانگ و ورود به شورت
# استراتژی بازگشتی
df.loc[(df['close'] > df['fast_ema']) & (df['fast_ema'] < df['slow_ema']), 'position'] = 1 # ورود به لانگ بازگشتی
df.loc[(df['close'] < df['fast_ema']) & (df['fast_ema'] < df['slow_ema']), 'position'] = -1 # خروج از لانگ بازگشتی
# محاسبه سود و زیان
df['returns'] = df['close'].pct_change()
df['strategy_returns'] = df['position'].shift(1) * df['returns']
df['cumulative_strategy_returns'] = (1 + df['strategy_returns']).cumprod()
# مشخص کردن نقاط ورود و خروج
df['entry_signal'] = (df['position'] > df['position'].shift(1)) # ورود به پوزیشن
df['exit_signal'] = (df['position'] < df['position'].shift(1)) # خروج از پوزیشن
# رسم نمودار قیمت و EMAها
fig = go.Figure()
# کندلاستیک
fig.add_trace(go.Candlestick(
x=df['timestamp'],
open=df['open'],
high=df['high'],
low=df['low'],
close=df['close'],
name='Price'
))
# EMA سریع
fig.add_trace(go.Scatter(
x=df['timestamp'],
y=df['fast_ema'],
mode='lines',
name='Fast EMA',
line=dict(color='blue', width=2)
))
# EMA کند
fig.add_trace(go.Scatter(
x=df['timestamp'],
y=df['slow_ema'],
mode='lines',
name='Slow EMA',
line=dict(color='red', width=2)
))
# نقاط ورود
fig.add_trace(go.Scatter(
x=df.loc[df['entry_signal'], 'timestamp'],
y=df.loc[df['entry_signal'], 'close'],
mode='markers',
marker=dict(color='green', size=10, symbol='triangle-up'),
name='Entry'
))
# نقاط خروج
fig.add_trace(go.Scatter(
x=df.loc[df['exit_signal'], 'timestamp'],
y=df.loc[df['exit_signal'], 'close'],
mode='markers',
marker=dict(color='red', size=10, symbol='triangle-down'),
name='Exit'
))
# تنظیمات نمودار
fig.update_layout(
title='Bitcoin to Rial with Dual EMA Strategy',
xaxis_title='Date',
yaxis_title='Price (IRR)',
xaxis_rangeslider_visible=False,
template='plotly_dark'
)
fig.show()
# رسم نمودار سود استراتژی
fig_returns = go.Figure()
fig_returns.add_trace(go.Scatter(
x=df['timestamp'],
y=df['cumulative_strategy_returns'],
mode='lines',
name='Strategy Returns',
line=dict(color='green', width=2)
))
# تنظیمات نمودار سود استراتژی
fig_returns.update_layout(
title='Cumulative Strategy Returns',
xaxis_title='Date',
yaxis_title='Cumulative Returns',
template='plotly_dark'
)
fig_returns.show()
else:
print('Error in fetching data:', data.get('errmsg', 'Unknown error'))
این کد دادههای تاریخی بیتکوین به ریال (BTC/IRT) را از API نوبیتکس دریافت میکند و با استفاده از دو شاخص میانگین متحرک نمایی (EMA)، سیگنالهای ورود و خروج به معاملات را بر اساس شرایط مختلف تولید میکند. همچنین، بازدهی استراتژی محاسبه و نمودارهای قیمت، نقاط ورود و خروج، و بازدهی تجمعی استراتژی رسم میشوند.
/market/udf/history) برای دریافت دادههاtimestampopenhighlowclosevolumeimport requests
import pandas as pd
from datetime import datetime, timedelta
import plotly.graph_objects as go
import warnings
warnings.filterwarnings("ignore")
# تنظیمات
symbol = 'BTCIRT'
resolution = '360' # 8 ساعت
to_date = datetime.now()
from_date = to_date - timedelta(days=365) # ۳۰ روز گذشته
# تبدیل تاریخ به timestamp
to_timestamp = int(to_date.timestamp())
from_timestamp = int(from_date.timestamp())
# درخواست داده از نوبیتکس
url = 'https://api.nobitex.ir/market/udf/history'
params = {
'symbol': symbol,
'resolution': resolution,
'from': from_timestamp,
'to': to_timestamp
}
response = requests.get(url, params=params)
data = response.json()
if data['s'] == 'ok':
# ساخت DataFrame
df = pd.DataFrame({
'timestamp': data['t'],
'open': data['o'],
'high': data['h'],
'low': data['l'],
'close': data['c'],
'volume': data['v']
})
# تبدیل timestamp به datetime
df['timestamp'] = pd.to_datetime(df['timestamp'], unit='s')
# محاسبه EMA
fast_ema_period = 17
slow_ema_period = 21
df['fast_ema'] = df['close'].ewm(span=fast_ema_period, adjust=False).mean()
df['slow_ema'] = df['close'].ewm(span=slow_ema_period, adjust=False).mean()
# تعریف موقعیتها (پوزیشنها)
df['position'] = 0
# استراتژی روند
df.loc[(df['close'] > df['fast_ema']) & (df['fast_ema'] > df['slow_ema']), 'position'] = 1 # ورود به لانگ
df.loc[(df['close'] < df['fast_ema']) & (df['fast_ema'] > df['slow_ema']), 'position'] = -1 # خروج از لانگ و ورود به شورت
# استراتژی بازگشتی
df.loc[(df['close'] > df['fast_ema']) & (df['fast_ema'] < df['slow_ema']), 'position'] = 1 # ورود به لانگ بازگشتی
df.loc[(df['close'] < df['fast_ema']) & (df['fast_ema'] < df['slow_ema']), 'position'] = -1 # خروج از لانگ بازگشتی
# محاسبه سود و زیان
df['returns'] = df['close'].pct_change()
df['strategy_returns'] = df['position'].shift(1) * df['returns']
df['cumulative_strategy_returns'] = (1 + df['strategy_returns']).cumprod()
# مشخص کردن نقاط ورود و خروج
df['entry_long'] = (df['position'] > df['position'].shift(1)) & (df['position'] == 1) # ورود لانگ
df['exit_long'] = (df['position'] < df['position'].shift(1)) & (df['position'] == 0) # خروج لانگ
df['entry_short'] = (df['position'] < df['position'].shift(1)) & (df['position'] == -1) # ورود شورت
df['exit_short'] = (df['position'] > df['position'].shift(1)) & (df['position'] == 0) # خروج شورت
# رسم نمودار قیمت و EMAها
fig = go.Figure()
# کندلاستیک
fig.add_trace(go.Candlestick(
x=df['timestamp'],
open=df['open'],
high=df['high'],
low=df['low'],
close=df['close'],
name='Price'
))
# EMA سریع
fig.add_trace(go.Scatter(
x=df['timestamp'],
y=df['fast_ema'],
mode='lines',
name='Fast EMA',
line=dict(color='blue', width=2)
))
# EMA کند
fig.add_trace(go.Scatter(
x=df['timestamp'],
y=df['slow_ema'],
mode='lines',
name='Slow EMA',
line=dict(color='red', width=2)
))
# نقاط ورود لانگ
fig.add_trace(go.Scatter(
x=df.loc[df['entry_long'], 'timestamp'],
y=df.loc[df['entry_long'], 'close'],
mode='markers',
marker=dict(color='green', size=12, symbol='triangle-up'),
name='Long Entry'
))
# نقاط خروج لانگ
fig.add_trace(go.Scatter(
x=df.loc[df['exit_long'], 'timestamp'],
y=df.loc[df['exit_long'], 'close'],
mode='markers',
marker=dict(color='orange', size=12, symbol='triangle-down'),
name='Long Exit'
))
# نقاط ورود شورت
fig.add_trace(go.Scatter(
x=df.loc[df['entry_short'], 'timestamp'],
y=df.loc[df['entry_short'], 'close'],
mode='markers',
marker=dict(color='red', size=12, symbol='triangle-down'),
name='Short Entry'
))
# نقاط خروج شورت
fig.add_trace(go.Scatter(
x=df.loc[df['exit_short'], 'timestamp'],
y=df.loc[df['exit_short'], 'close'],
mode='markers',
marker=dict(color='purple', size=12, symbol='triangle-up'),
name='Short Exit'
))
# تنظیمات نمودار قیمت
fig.update_layout(
title='Bitcoin to Rial with Dual EMA Strategy',
xaxis_title='Date',
yaxis_title='Price (IRR)',
xaxis_rangeslider_visible=False,
template='plotly_dark'
)
fig.show()
# رسم نمودار سود استراتژی
fig_returns = go.Figure()
fig_returns.add_trace(go.Scatter(
x=df['timestamp'],
y=df['cumulative_strategy_returns'],
mode='lines',
name='Strategy Returns',
line=dict(color='green', width=2)
))
# تنظیمات نمودار سود استراتژی
fig_returns.update_layout(
title='Cumulative Strategy Returns',
xaxis_title='Date',
yaxis_title='Cumulative Return (Multiplier)',
template='plotly_dark'
)
fig_returns.show()
else:
print('Error in fetching data:', data.get('errmsg', 'Unknown error'))
این کد دادههای تاریخی بیتکوین به ریال (BTC/IRT) را از API نوبیتکس دریافت کرده و با استفاده از بهینهسازی پارامترهای دو میانگین متحرک نمایی (EMA)، بهترین پارامترها را برای استراتژی معاملاتی پیدا میکند. در نهایت، بهترین دورههای EMA سریع و کند و بازدهی تجمعی مربوط به آنها نمایش داده میشود.
---/market/udf/history) برای دریافت دادههاtimestampopenhighlowclosevolumepandas و requests دادهها را پردازش میکندimport requests
import pandas as pd
from datetime import datetime, timedelta
from itertools import product
import warnings
warnings.filterwarnings("ignore")
# تنظیمات
symbol = 'BTCIRT'
resolution = '360' # 8 ساعت
to_date = datetime.now()
from_date = to_date - timedelta(days=365) # 365 روز گذشته
# تبدیل تاریخ به timestamp
to_timestamp = int(to_date.timestamp())
from_timestamp = int(from_date.timestamp())
# درخواست داده از نوبیتکس
url = 'https://api.nobitex.ir/market/udf/history'
params = {
'symbol': symbol,
'resolution': resolution,
'from': from_timestamp,
'to': to_timestamp
}
response = requests.get(url, params=params)
data = response.json()
if data['s'] == 'ok':
# ساخت DataFrame
df = pd.DataFrame({
'timestamp': data['t'],
'open': data['o'],
'high': data['h'],
'low': data['l'],
'close': data['c'],
'volume': data['v']
})
# تبدیل timestamp به datetime
df['timestamp'] = pd.to_datetime(df['timestamp'], unit='s')
# محدوده پارامترهای EMA
fast_ema_range = range(5, 20) # دورههای سریع
slow_ema_range = range(20, 50) # دورههای کند
best_params = None
best_performance = -float('inf')
# بررسی همه ترکیبهای پارامترها
for fast_ema_period, slow_ema_period in product(fast_ema_range, slow_ema_range):
if fast_ema_period >= slow_ema_period:
continue # شرط برای اطمینان از اینکه fast EMA < slow EMA
# محاسبه EMAها
df['fast_ema'] = df['close'].ewm(span=fast_ema_period, adjust=False).mean()
df['slow_ema'] = df['close'].ewm(span=slow_ema_period, adjust=False).mean()
# تعریف موقعیتها
df['position'] = 0
df.loc[(df['close'] > df['fast_ema']) & (df['fast_ema'] > df['slow_ema']), 'position'] = 1 # ورود لانگ
df.loc[(df['close'] < df['fast_ema']) & (df['fast_ema'] > df['slow_ema']), 'position'] = -1 # خروج از لانگ و ورود به شورت
# محاسبه سود و زیان
df['returns'] = df['close'].pct_change()
df['strategy_returns'] = df['position'].shift(1) * df['returns']
cumulative_strategy_returns = (1 + df['strategy_returns']).cumprod().iloc[-1]
# ذخیره بهترین عملکرد
if cumulative_strategy_returns > best_performance:
best_performance = cumulative_strategy_returns
best_params = (fast_ema_period, slow_ema_period)
# نمایش بهترین پارامترها و عملکرد
print(f"Best Parameters: Fast EMA = {best_params[0]}, Slow EMA = {best_params[1]}")
print(f"Best Cumulative Return: {best_performance:.2f}")
else:
print('Error in fetching data:', data.get('errmsg', 'Unknown error'))
Best Parameters: Fast EMA = 13, Slow EMA = 20 Best Cumulative Return: 3.31
این کد دادههای تاریخی بیتکوین به ریال (BTC/IRT) را از API نوبیتکس دریافت کرده و بهترین پارامترهای دو میانگین متحرک نمایی (EMA) را برای استراتژی معاملاتی پیدا میکند. همچنین، سود و زیان استراتژی با احتساب کارمزد ۰.۲٪ محاسبه و نمودارهای مرتبط نمایش داده میشوند.
---/market/udf/history) برای دریافت دادههاtimestampopenhighlowclosevolumepandas، requests و plotly دادهها را پردازش و نمایش میدهدimport requests
import pandas as pd
from datetime import datetime, timedelta
from itertools import product
import plotly.graph_objects as go
import warnings
warnings.filterwarnings("ignore")
# تنظیمات
symbol = 'BTCIRT'
resolution = '360' # تایمفریم شش ساعته
to_date = datetime.now()
from_date = to_date - timedelta(days=1500) # ذو سال گذشته
fee = 0.002 # کارمزد ۰.۲٪
# تبدیل تاریخ به timestamp
to_timestamp = int(to_date.timestamp())
from_timestamp = int(from_date.timestamp())
# درخواست داده از نوبیتکس
url = 'https://api.nobitex.ir/market/udf/history'
params = {
'symbol': symbol,
'resolution': resolution,
'from': from_timestamp,
'to': to_timestamp
}
response = requests.get(url, params=params)
data = response.json()
if data['s'] == 'ok':
# ساخت DataFrame
df = pd.DataFrame({
'timestamp': data['t'],
'open': data['o'],
'high': data['h'],
'low': data['l'],
'close': data['c'],
'volume': data['v']
})
# تبدیل timestamp به datetime
df['timestamp'] = pd.to_datetime(df['timestamp'], unit='s')
# محدوده پارامترهای EMA
fast_ema_range = range(5, 20) # دورههای سریع
slow_ema_range = range(20, 50) # دورههای کند
best_params = None
best_performance = -float('inf')
# بررسی همه ترکیبهای پارامترها
for fast_ema_period, slow_ema_period in product(fast_ema_range, slow_ema_range):
if fast_ema_period >= slow_ema_period:
continue # شرط برای اطمینان از اینکه fast EMA < slow EMA
# محاسبه EMAها
df['fast_ema'] = df['close'].ewm(span=fast_ema_period, adjust=False).mean()
df['slow_ema'] = df['close'].ewm(span=slow_ema_period, adjust=False).mean()
# تعریف موقعیتها
df['position'] = 0
df.loc[(df['close'] > df['fast_ema']) & (df['fast_ema'] > df['slow_ema']), 'position'] = 1 # ورود لانگ
df.loc[(df['close'] < df['fast_ema']) & (df['fast_ema'] > df['slow_ema']), 'position'] = -1 # ورود شورت
# محاسبه سود و زیان با لحاظ کارمزد
df['returns'] = df['close'].pct_change()
df['trade'] = df['position'].diff().abs() # تغییر موقعیت نشاندهنده معامله است
df['strategy_returns'] = (df['position'].shift(1) * df['returns']) - (df['trade'] * fee)
cumulative_strategy_returns = (1 + df['strategy_returns']).cumprod().iloc[-1]
# ذخیره بهترین عملکرد
if cumulative_strategy_returns > best_performance:
best_performance = cumulative_strategy_returns
best_params = (fast_ema_period, slow_ema_period)
# بهترین پارامترها
print(f"Best Parameters: Fast EMA = {best_params[0]}, Slow EMA = {best_params[1]}")
print(f"Best Cumulative Return (after fees): {best_performance:.2f}")
# اجرای بکتست با بهترین پارامترها
df['fast_ema'] = df['close'].ewm(span=best_params[0], adjust=False).mean()
df['slow_ema'] = df['close'].ewm(span=best_params[1], adjust=False).mean()
df['position'] = 0
df.loc[(df['close'] > df['fast_ema']) & (df['fast_ema'] > df['slow_ema']), 'position'] = 1
df.loc[(df['close'] < df['fast_ema']) & (df['fast_ema'] > df['slow_ema']), 'position'] = -1
df['returns'] = df['close'].pct_change()
df['trade'] = df['position'].diff().abs()
df['strategy_returns'] = (df['position'].shift(1) * df['returns']) - (df['trade'] * fee)
df['cumulative_strategy_returns'] = (1 + df['strategy_returns']).cumprod()
# نقاط ورود و خروج
df['entry_long'] = (df['position'] > df['position'].shift(1)) & (df['position'] == 1)
df['exit_long'] = (df['position'] < 1) & (df['position'].shift(1) == 1) # اصلاح شده
df['entry_short'] = (df['position'] < df['position'].shift(1)) & (df['position'] == -1)
df['exit_short'] = (df['position'] > -1) & (df['position'].shift(1) == -1)
# رسم نمودار قیمت و EMAها
fig = go.Figure()
# کندلاستیک
fig.add_trace(go.Candlestick(
x=df['timestamp'],
open=df['open'],
high=df['high'],
low=df['low'],
close=df['close'],
name='Price'
))
# EMA سریع
fig.add_trace(go.Scatter(
x=df['timestamp'],
y=df['fast_ema'],
mode='lines',
name='Fast EMA',
line=dict(color='blue', width=2)
))
# EMA کند
fig.add_trace(go.Scatter(
x=df['timestamp'],
y=df['slow_ema'],
mode='lines',
name='Slow EMA',
line=dict(color='red', width=2)
))
# نقاط ورود لانگ
fig.add_trace(go.Scatter(
x=df.loc[df['entry_long'], 'timestamp'],
y=df.loc[df['entry_long'], 'close'],
mode='markers',
marker=dict(color='green', size=12, symbol='triangle-up'),
name='Long Entry'
))
# نقاط خروج لانگ
fig.add_trace(go.Scatter(
x=df.loc[df['exit_long'], 'timestamp'],
y=df.loc[df['exit_long'], 'close'],
mode='markers',
marker=dict(color='orange', size=12, symbol='triangle-down'),
name='Long Exit'
))
# نقاط ورود شورت
fig.add_trace(go.Scatter(
x=df.loc[df['entry_short'], 'timestamp'],
y=df.loc[df['entry_short'], 'close'],
mode='markers',
marker=dict(color='red', size=12, symbol='triangle-down'),
name='Short Entry'
))
# نقاط خروج شورت
fig.add_trace(go.Scatter(
x=df.loc[df['exit_short'], 'timestamp'],
y=df.loc[df['exit_short'], 'close'],
mode='markers',
marker=dict(color='purple', size=12, symbol='triangle-up'),
name='Short Exit'
))
# تنظیمات نمودار قیمت
fig.update_layout(
title='Bitcoin to Rial with Best EMA Strategy (6 hours)',
xaxis_title='Date',
yaxis_title='Price (IRR)',
xaxis_rangeslider_visible=False,
template='plotly_dark'
)
fig.show()
else:
print('Error in fetching data:', data.get('errmsg', 'Unknown error'))
Best Parameters: Fast EMA = 17, Slow EMA = 20 Best Cumulative Return (after fees): 31.30
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings("ignore")
# رسم نمودار سود تجمعی استراتژی
fig_returns = go.Figure()
fig_returns.add_trace(go.Scatter(
x=df['timestamp'],
y=df['cumulative_strategy_returns'],
mode='lines',
name='Cumulative Returns',
line=dict(color='green', width=2)
))
# تنظیمات نمودار سود تجمعی
fig_returns.update_layout(
title='Cumulative Strategy Returns (6 hours, After Fees)',
xaxis_title='Date',
yaxis_title='Cumulative Return (Multiplier)',
template='plotly_dark'
)
fig_returns.show()
# رسم نمودار توزیع سود معاملات
df['trade_pnl'] = df['strategy_returns'][df['strategy_returns'] != 0] # فقط معاملات غیرصفر
plt.figure(figsize=(10, 6))
plt.hist(df['trade_pnl'], bins=30, color='blue', alpha=0.7, edgecolor='black')
plt.title('Distribution of Trade P&Ls')
plt.xlabel('Profit or Loss')
plt.ylabel('Frequency')
plt.grid(True)
plt.show()
این کد دادههای تاریخی بیتکوین به ریال (BTC/IRT) را از API نوبیتکس دریافت کرده و دو میانگین متحرک نمایی (EMA) سریع و کند را محاسبه میکند. سپس، استراتژیهای Trend Following و Mean Reversion اعمال شده و بازدهی تجمعی استراتژی همراه با نقاط ورود و خروج نمایش داده میشوند.
---/market/udf/history) برای دریافت دادههاtimestampopenhighlowclosevolumepandas، requests و plotly دادهها را پردازش و نمایش میدهدimport requests
import pandas as pd
from datetime import datetime, timedelta
import plotly.graph_objects as go
import warnings
warnings.filterwarnings("ignore")
# تنظیمات
symbol = 'BTCIRT'
resolution = '360' # تایمفریم روزانه
to_date = datetime.now()
from_date = to_date - timedelta(days=730) # دو سال گذشته
fee = 0.002 # کارمزد ۰.۲٪
# تبدیل تاریخ به timestamp
to_timestamp = int(to_date.timestamp())
from_timestamp = int(from_date.timestamp())
# درخواست داده از نوبیتکس
url = 'https://api.nobitex.ir/market/udf/history'
params = {
'symbol': symbol,
'resolution': resolution,
'from': from_timestamp,
'to': to_timestamp
}
response = requests.get(url, params=params)
data = response.json()
if data['s'] == 'ok':
# ساخت DataFrame
df = pd.DataFrame({
'timestamp': data['t'],
'open': data['o'],
'high': data['h'],
'low': data['l'],
'close': data['c'],
'volume': data['v']
})
df['timestamp'] = pd.to_datetime(df['timestamp'], unit='s')
# پارامترهای EMA
fast_ema_period = 12
slow_ema_period = 26
# محاسبه EMAها
df['fast_ema'] = df['close'].ewm(span=fast_ema_period, adjust=False).mean()
df['slow_ema'] = df['close'].ewm(span=slow_ema_period, adjust=False).mean()
# تعریف موقعیتها
df['position'] = 0
# استراتژی Trend Following
df.loc[(df['close'] > df['fast_ema']) & (df['fast_ema'] > df['slow_ema']), 'position'] = 1 # ورود لانگ
df.loc[(df['close'] < df['fast_ema']) & (df['fast_ema'] > df['slow_ema']), 'position'] = -1 # ورود شورت
# استراتژی Mean Reversion
df.loc[(df['close'] < df['fast_ema']) & (df['fast_ema'] < df['slow_ema']), 'position'] = 1 # ورود لانگ
df.loc[(df['close'] > df['fast_ema']) & (df['fast_ema'] < df['slow_ema']), 'position'] = -1 # ورود شورت
# محاسبه سود و زیان
df['returns'] = df['close'].pct_change()
df['trade'] = df['position'].diff().abs() # تغییر موقعیت نشاندهنده معامله است
df['strategy_returns'] = (df['position'].shift(1) * df['returns']) - (df['trade'] * fee)
df['cumulative_strategy_returns'] = (1 + df['strategy_returns']).cumprod()
# نقاط ورود و خروج
df['entry_long'] = (df['position'] > df['position'].shift(1)) & (df['position'] == 1)
df['exit_long'] = (df['position'] < 1) & (df['position'].shift(1) == 1)
df['entry_short'] = (df['position'] < df['position'].shift(1)) & (df['position'] == -1)
df['exit_short'] = (df['position'] > -1) & (df['position'].shift(1) == -1)
# رسم نمودار قیمت و EMAها
fig = go.Figure()
# کندلاستیک
fig.add_trace(go.Candlestick(
x=df['timestamp'],
open=df['open'],
high=df['high'],
low=df['low'],
close=df['close'],
name='Price'
))
# EMA سریع
fig.add_trace(go.Scatter(
x=df['timestamp'],
y=df['fast_ema'],
mode='lines',
name='Fast EMA',
line=dict(color='blue', width=2)
))
# EMA کند
fig.add_trace(go.Scatter(
x=df['timestamp'],
y=df['slow_ema'],
mode='lines',
name='Slow EMA',
line=dict(color='red', width=2)
))
# نقاط ورود و خروج
fig.add_trace(go.Scatter(
x=df.loc[df['entry_long'], 'timestamp'],
y=df.loc[df['entry_long'], 'close'],
mode='markers',
marker=dict(color='green', size=12, symbol='triangle-up'),
name='Long Entry'
))
fig.add_trace(go.Scatter(
x=df.loc[df['exit_long'], 'timestamp'],
y=df.loc[df['exit_long'], 'close'],
mode='markers',
marker=dict(color='orange', size=12, symbol='triangle-down'),
name='Long Exit'
))
fig.add_trace(go.Scatter(
x=df.loc[df['entry_short'], 'timestamp'],
y=df.loc[df['entry_short'], 'close'],
mode='markers',
marker=dict(color='red', size=12, symbol='triangle-down'),
name='Short Entry'
))
fig.add_trace(go.Scatter(
x=df.loc[df['exit_short'], 'timestamp'],
y=df.loc[df['exit_short'], 'close'],
mode='markers',
marker=dict(color='purple', size=12, symbol='triangle-up'),
name='Short Exit'
))
# تنظیمات نمودار قیمت
fig.update_layout(
title='Bitcoin to Rial - Combined Strategy (6h)',
xaxis_title='Date',
yaxis_title='Price (IRR)',
xaxis_rangeslider_visible=False,
template='plotly_dark'
)
fig.show()
# رسم نمودار سود تجمعی
fig_returns = go.Figure()
fig_returns.add_trace(go.Scatter(
x=df['timestamp'],
y=df['cumulative_strategy_returns'],
mode='lines',
name='Cumulative Returns',
line=dict(color='green', width=2)
))
# تنظیمات نمودار سود تجمعی
fig_returns.update_layout(
title='Cumulative Strategy Returns (6h, After Fees)',
xaxis_title='Date',
yaxis_title='Cumulative Return (Multiplier)',
template='plotly_dark'
)
fig_returns.show()
else:
print('Error in fetching data:', data.get('errmsg', 'Unknown error'))
این کد دادههای تاریخی بیتکوین به ریال (BTC/IRT) را از API نوبیتکس دریافت کرده و دو میانگین متحرک نمایی (EMA) سریع و کند را محاسبه میکند. سپس، استراتژیهای Trend Following و Mean Reversion اعمال شده و بازدهی تجمعی استراتژی همراه با نقاط ورود و خروج نمایش داده میشوند.
---/market/udf/history) برای دریافت دادههاtimestampopenhighlowclosevolumepandas، requests و plotly دادهها را پردازش و نمایش میدهدimport requests
import pandas as pd
from datetime import datetime, timedelta
import plotly.graph_objects as go
import warnings
warnings.filterwarnings("ignore")
# تنظیمات
symbol = 'BTCIRT'
resolution = '360' # تایمفریم روزانه
to_date = datetime.now()
from_date = to_date - timedelta(days=730) # یک سال گذشته
fee = 0.002 # کارمزد ۰.۲٪
# تبدیل تاریخ به timestamp
to_timestamp = int(to_date.timestamp())
from_timestamp = int(from_date.timestamp())
# درخواست داده از نوبیتکس
url = 'https://api.nobitex.ir/market/udf/history'
params = {
'symbol': symbol,
'resolution': resolution,
'from': from_timestamp,
'to': to_timestamp
}
response = requests.get(url, params=params)
data = response.json()
if data['s'] == 'ok':
# ساخت DataFrame
df = pd.DataFrame({
'timestamp': data['t'],
'open': data['o'],
'high': data['h'],
'low': data['l'],
'close': data['c'],
'volume': data['v']
})
df['timestamp'] = pd.to_datetime(df['timestamp'], unit='s')
# پارامترهای EMA
fast_ema_period = 17
slow_ema_period = 21
# محاسبه EMAها
df['fast_ema'] = df['close'].ewm(span=fast_ema_period, adjust=False).mean()
df['slow_ema'] = df['close'].ewm(span=slow_ema_period, adjust=False).mean()
# تعریف موقعیتها
df['position'] = 0
# استراتژی Trend Following: فقط لانگ
df.loc[(df['close'] > df['fast_ema']) & (df['fast_ema'] > df['slow_ema']), 'position'] = 1 # ورود لانگ
# استراتژی Mean Reversion: لانگ و شورت
df.loc[(df['close'] < df['fast_ema']) & (df['fast_ema'] < df['slow_ema']), 'position'] = 1 # ورود لانگ
df.loc[(df['close'] > df['fast_ema']) & (df['fast_ema'] < df['slow_ema']), 'position'] = -1 # ورود شورت
# محاسبه سود و زیان
df['returns'] = df['close'].pct_change()
df['trade'] = df['position'].diff().abs() # تغییر موقعیت نشاندهنده معامله است
df['strategy_returns'] = (df['position'].shift(1) * df['returns']) - (df['trade'] * fee)
df['cumulative_strategy_returns'] = (1 + df['strategy_returns']).cumprod()
# نقاط ورود و خروج
df['entry_long'] = (df['position'] > df['position'].shift(1)) & (df['position'] == 1)
df['exit_long'] = (df['position'] < 1) & (df['position'].shift(1) == 1)
df['entry_short'] = (df['position'] < df['position'].shift(1)) & (df['position'] == -1)
df['exit_short'] = (df['position'] > -1) & (df['position'].shift(1) == -1)
# رسم نمودار قیمت و EMAها
fig = go.Figure()
# کندلاستیک
fig.add_trace(go.Candlestick(
x=df['timestamp'],
open=df['open'],
high=df['high'],
low=df['low'],
close=df['close'],
name='Price'
))
# EMA سریع
fig.add_trace(go.Scatter(
x=df['timestamp'],
y=df['fast_ema'],
mode='lines',
name='Fast EMA',
line=dict(color='blue', width=2)
))
# EMA کند
fig.add_trace(go.Scatter(
x=df['timestamp'],
y=df['slow_ema'],
mode='lines',
name='Slow EMA',
line=dict(color='red', width=2)
))
# نقاط ورود و خروج
fig.add_trace(go.Scatter(
x=df.loc[df['entry_long'], 'timestamp'],
y=df.loc[df['entry_long'], 'close'],
mode='markers',
marker=dict(color='green', size=12, symbol='triangle-up'),
name='Long Entry'
))
fig.add_trace(go.Scatter(
x=df.loc[df['exit_long'], 'timestamp'],
y=df.loc[df['exit_long'], 'close'],
mode='markers',
marker=dict(color='orange', size=12, symbol='triangle-down'),
name='Long Exit'
))
fig.add_trace(go.Scatter(
x=df.loc[df['entry_short'], 'timestamp'],
y=df.loc[df['entry_short'], 'close'],
mode='markers',
marker=dict(color='red', size=12, symbol='triangle-down'),
name='Short Entry'
))
fig.add_trace(go.Scatter(
x=df.loc[df['exit_short'], 'timestamp'],
y=df.loc[df['exit_short'], 'close'],
mode='markers',
marker=dict(color='purple', size=12, symbol='triangle-up'),
name='Short Exit'
))
# تنظیمات نمودار قیمت
fig.update_layout(
title='Bitcoin to Rial - Combined Strategy (6h)',
xaxis_title='Date',
yaxis_title='Price (IRR)',
xaxis_rangeslider_visible=False,
template='plotly_dark'
)
fig.show()
# رسم نمودار سود تجمعی
fig_returns = go.Figure()
fig_returns.add_trace(go.Scatter(
x=df['timestamp'],
y=df['cumulative_strategy_returns'],
mode='lines',
name='Cumulative Returns',
line=dict(color='green', width=2)
))
# تنظیمات نمودار سود تجمعی
fig_returns.update_layout(
title='Cumulative Strategy Returns (6h, After Fees)',
xaxis_title='Date',
yaxis_title='Cumulative Return (Multiplier)',
template='plotly_dark'
)
fig_returns.show()
else:
print('Error in fetching data:', data.get('errmsg', 'Unknown error'))
این کد دادههای تاریخی بیتکوین به ریال (BTC/IRT) را از API نوبیتکس دریافت کرده و میانگینهای متحرک نمایی (EMA) سریع و کند را برای دورههای مختلف محاسبه میکند. سپس، بهترین ترکیب پارامترها برای استراتژیهای Trend Following (فقط لانگ) و Mean Reversion (لانگ و شورت) بر اساس بازدهی تجمعی، با احتساب کارمزد معاملات تعیین میشود.
---/market/udf/history) برای دریافت دادههاtimestampopenhighlowclosevolumepandas، requests و plotly دادهها را پردازش و نمایش میدهدimport requests
import pandas as pd
from datetime import datetime, timedelta
from itertools import product
import plotly.graph_objects as go
import warnings
warnings.filterwarnings("ignore")
# تنظیمات
symbol = 'BTCIRT'
resolution = '360' # تایمفریم روزانه
to_date = datetime.now()
from_date = to_date - timedelta(days=730) # یک سال گذشته
fee = 0.002 # کارمزد ۰.۲٪
# تبدیل تاریخ به timestamp
to_timestamp = int(to_date.timestamp())
from_timestamp = int(from_date.timestamp())
# درخواست داده از نوبیتکس
url = 'https://api.nobitex.ir/market/udf/history'
params = {
'symbol': symbol,
'resolution': resolution,
'from': from_timestamp,
'to': to_timestamp
}
response = requests.get(url, params=params)
data = response.json()
if data['s'] == 'ok':
# ساخت DataFrame
df = pd.DataFrame({
'timestamp': data['t'],
'open': data['o'],
'high': data['h'],
'low': data['l'],
'close': data['c'],
'volume': data['v']
})
df['timestamp'] = pd.to_datetime(df['timestamp'], unit='s')
# محدوده پارامترهای EMA
fast_ema_range = range(5, 20) # دورههای سریع
slow_ema_range = range(20, 50) # دورههای کند
best_params = None
best_performance = -float('inf')
# بررسی همه ترکیبهای پارامترها
for fast_ema_period, slow_ema_period in product(fast_ema_range, slow_ema_range):
if fast_ema_period >= slow_ema_period:
continue # شرط برای اطمینان از اینکه fast EMA < slow EMA
# محاسبه EMAها
df['fast_ema'] = df['close'].ewm(span=fast_ema_period, adjust=False).mean()
df['slow_ema'] = df['close'].ewm(span=slow_ema_period, adjust=False).mean()
# تعریف موقعیتها
df['position'] = 0
# Trend Following (فقط لانگ)
df.loc[(df['close'] > df['fast_ema']) & (df['fast_ema'] > df['slow_ema']), 'position'] = 1
# Mean Reversion (لانگ و شورت)
df.loc[(df['close'] < df['fast_ema']) & (df['fast_ema'] < df['slow_ema']), 'position'] = 1
df.loc[(df['close'] > df['fast_ema']) & (df['fast_ema'] < df['slow_ema']), 'position'] = -1
# محاسبه سود و زیان
df['returns'] = df['close'].pct_change()
df['trade'] = df['position'].diff().abs() # تغییر موقعیت نشاندهنده معامله است
df['strategy_returns'] = (df['position'].shift(1) * df['returns']) - (df['trade'] * fee)
cumulative_strategy_returns = (1 + df['strategy_returns']).cumprod().iloc[-1]
# ذخیره بهترین عملکرد
if cumulative_strategy_returns > best_performance:
best_performance = cumulative_strategy_returns
best_params = (fast_ema_period, slow_ema_period)
# بهترین پارامترها
print(f"Best Parameters: Fast EMA = {best_params[0]}, Slow EMA = {best_params[1]}")
print(f"Best Cumulative Return (after fees): {best_performance:.2f}")
# اجرای بکتست با بهترین پارامترها
df['fast_ema'] = df['close'].ewm(span=best_params[0], adjust=False).mean()
df['slow_ema'] = df['close'].ewm(span=best_params[1], adjust=False).mean()
df['position'] = 0
df.loc[(df['close'] > df['fast_ema']) & (df['fast_ema'] > df['slow_ema']), 'position'] = 1
df.loc[(df['close'] < df['fast_ema']) & (df['fast_ema'] < df['slow_ema']), 'position'] = 1
df.loc[(df['close'] > df['fast_ema']) & (df['fast_ema'] < df['slow_ema']), 'position'] = -1
df['returns'] = df['close'].pct_change()
df['trade'] = df['position'].diff().abs()
df['strategy_returns'] = (df['position'].shift(1) * df['returns']) - (df['trade'] * fee)
df['cumulative_strategy_returns'] = (1 + df['strategy_returns']).cumprod()
# رسم نمودار قیمت و EMAها
fig = go.Figure()
# کندلاستیک
fig.add_trace(go.Candlestick(
x=df['timestamp'],
open=df['open'],
high=df['high'],
low=df['low'],
close=df['close'],
name='Price'
))
# EMA سریع
fig.add_trace(go.Scatter(
x=df['timestamp'],
y=df['fast_ema'],
mode='lines',
name='Fast EMA',
line=dict(color='blue', width=2)
))
# EMA کند
fig.add_trace(go.Scatter(
x=df['timestamp'],
y=df['slow_ema'],
mode='lines',
name='Slow EMA',
line=dict(color='red', width=2)
))
# تنظیمات نمودار قیمت
fig.update_layout(
title='Bitcoin to Rial - Optimized Combined Strategy (6h)',
xaxis_title='Date',
yaxis_title='Price (IRR)',
xaxis_rangeslider_visible=False,
template='plotly_dark'
)
fig.show()
# رسم نمودار سود تجمعی
fig_returns = go.Figure()
fig_returns.add_trace(go.Scatter(
x=df['timestamp'],
y=df['cumulative_strategy_returns'],
mode='lines',
name='Cumulative Returns',
line=dict(color='green', width=2)
))
# تنظیمات نمودار سود تجمعی
fig_returns.update_layout(
title='Cumulative Strategy Returns (Daily, After Fees)',
xaxis_title='Date',
yaxis_title='Cumulative Return (Multiplier)',
template='plotly_dark'
)
fig_returns.show()
else:
print('Error in fetching data:', data.get('errmsg', 'Unknown error'))
Best Parameters: Fast EMA = 13, Slow EMA = 20 Best Cumulative Return (after fees): 3.17
این کد با استفاده از CoinGecko API اطلاعات ۲۰ ارز دیجیتال برتر از نظر ارزش بازار (Market Cap) را استخراج میکند. سپس لیستی از این ارزها شامل نام، نماد (Symbol)، و ارزش بازار تولید و نمایش میدهد.
---https://api.coingecko.com/api/v3/coins/markets برای دریافت اطلاعات.vs_currency=usd)order=market_cap_desc)per_page=20)page=1)response.raise_for_status().idsymbolmarket_captry-except.
[
{"id": "bitcoin", "symbol": "btc", "market_cap": 1234567890},
{"id": "ethereum", "symbol": "eth", "market_cap": 987654321},
...
]
requests برای ارسال درخواستها و پردازش دادهها استفاده میکند.import requests
def get_top_20_cryptos():
# درخواست دادهها از CoinGecko API
url = "https://api.coingecko.com/api/v3/coins/markets"
params = {
'vs_currency': 'usd',
'order': 'market_cap_desc',
'per_page': 20, # دریافت 20 ارز برتر
'page': 1,
}
try:
response = requests.get(url, params=params)
response.raise_for_status() # بررسی خطاهای درخواست
data = response.json()
# بررسی صحت فرمت دادهها
if isinstance(data, list):
# استخراج نام کوینها
return [{"id": coin['id'], "symbol": coin['symbol'], "market_cap": coin['market_cap']} for coin in data]
else:
print(f"Unexpected response format: {data}")
return []
except requests.exceptions.RequestException as e:
print(f"Request error: {e}")
return []
except ValueError as e:
print(f"JSON decode error: {e}")
return []
# فراخوانی تابع و دریافت لیست 20 ارز برتر
top_20_cryptos = get_top_20_cryptos()
print(top_20_cryptos)
[{'id': 'bitcoin', 'symbol': 'btc', 'market_cap': 1865170025789}, {'id': 'ethereum', 'symbol': 'eth', 'market_cap': 401111414564}, {'id': 'tether', 'symbol': 'usdt', 'market_cap': 138780901817}, {'id': 'ripple', 'symbol': 'xrp', 'market_cap': 123659496133}, {'id': 'binancecoin', 'symbol': 'bnb', 'market_cap': 101368240386}, {'id': 'solana', 'symbol': 'sol', 'market_cap': 88716714318}, {'id': 'dogecoin', 'symbol': 'doge', 'market_cap': 46344768998}, {'id': 'usd-coin', 'symbol': 'usdc', 'market_cap': 43546775967}, {'id': 'staked-ether', 'symbol': 'steth', 'market_cap': 32180992436}, {'id': 'cardano', 'symbol': 'ada', 'market_cap': 31057797672}, {'id': 'tron', 'symbol': 'trx', 'market_cap': 22253906184}, {'id': 'avalanche-2', 'symbol': 'avax', 'market_cap': 14910651886}, {'id': 'the-open-network', 'symbol': 'ton', 'market_cap': 14379134280}, {'id': 'wrapped-steth', 'symbol': 'wsteth', 'market_cap': 13886139767}, {'id': 'chainlink', 'symbol': 'link', 'market_cap': 13334978794}, {'id': 'shiba-inu', 'symbol': 'shib', 'market_cap': 12765020892}, {'id': 'wrapped-bitcoin', 'symbol': 'wbtc', 'market_cap': 12483299301}, {'id': 'sui', 'symbol': 'sui', 'market_cap': 11700866660}, {'id': 'bitget-token', 'symbol': 'bgb', 'market_cap': 11444403989}, {'id': 'stellar', 'symbol': 'xlm', 'market_cap': 10505621910}]
len(top_20_cryptos)
20
symbols = ["{}IRT".format(coin['symbol'].upper()) for coin in top_20_cryptos]# if coin['symbol'] not in ["usdt","usdc"]]
این کد استراتژی معاملاتی مبتنی بر دو میانگین متحرک نمایی (EMA) را برای چندین جفت رمز ارز از طریق دادههای دریافتی از API نوبیتکس اجرا کرده و بهترین پارامترهای ممکن را برای هر جفت ارز محاسبه میکند. علاوه بر آن، اطلاعاتی مانند سود نهایی استراتژی، وضعیت آخرین موقعیت (پوزیشن)، و سود و زیان تحققنیافته (uPNL) نیز ارائه میدهد.
---resolution=360).https://api.nobitex.ir/market/udf/history) برای هر نماد.pd.to_datetime().ewm.ewm.optimized_strategy_results_with_upnl.csv.import requests
import pandas as pd
from datetime import datetime, timedelta
from itertools import product
import warnings
warnings.filterwarnings("ignore")
# Configuration
# symbols = ['BTCIRT', 'ETHIRT', 'XRPIRT', 'BNBIRT', 'SOLIRT', 'DOGEIRT',
# 'ADAIRT', 'TRXIRT', 'AVAXIRT', 'TONIRT', 'LINKIRT', 'SHIBIRT',
# 'SUIIRT', 'HBARIRT']
resolution = '360' # Daily timeframe
to_date = datetime.now()
from_date = to_date - timedelta(days=730) # One year of data
fee = 0.002 # 0.2% trading fee
# EMA ranges
fast_ema_range = range(5, 20)
slow_ema_range = range(20, 50)
# Fetch market data
def fetch_data(symbol):
to_timestamp = int(to_date.timestamp())
from_timestamp = int(from_date.timestamp())
url = 'https://api.nobitex.ir/market/udf/history'
params = {
'symbol': symbol,
'resolution': resolution,
'from': from_timestamp,
'to': to_timestamp
}
response = requests.get(url, params=params)
data = response.json()
if data.get('s', 'error') == 'ok':
df = pd.DataFrame({
'timestamp': data['t'],
'open': data['o'],
'high': data['h'],
'low': data['l'],
'close': data['c'],
'volume': data['v']
})
df['timestamp'] = pd.to_datetime(df['timestamp'], unit='s')
return df
else:
print(f"Error fetching data for {symbol}: {data.get('errmsg', 'Unknown error')}")
return None
# Optimize strategy
def optimize_strategy(df):
best_params = None
best_performance = -float('inf')
best_df = None
for fast_ema_period, slow_ema_period in product(fast_ema_range, slow_ema_range):
if fast_ema_period >= slow_ema_period:
continue
# Calculate EMAs
df['fast_ema'] = df['close'].ewm(span=fast_ema_period, adjust=False).mean()
df['slow_ema'] = df['close'].ewm(span=slow_ema_period, adjust=False).mean()
# Define positions
df['position'] = 0
df.loc[(df['close'] > df['fast_ema']) & (df['fast_ema'] > df['slow_ema']), 'position'] = 1
df.loc[(df['close'] < df['fast_ema']) & (df['fast_ema'] < df['slow_ema']), 'position'] = -1
# Calculate strategy returns
df['returns'] = df['close'].pct_change()
df['trade'] = df['position'].diff().abs()
df['strategy_returns'] = (df['position'].shift(1) * df['returns']) - (df['trade'] * fee)
cumulative_strategy_returns = (1 + df['strategy_returns']).cumprod().iloc[-1]
# Update best parameters
if cumulative_strategy_returns > best_performance:
best_performance = cumulative_strategy_returns
best_params = (fast_ema_period, slow_ema_period)
best_df = df.copy()
return best_params, best_performance, best_df
# Run the strategy for all symbols
results = []
for symbol in symbols:
print(f"Processing {symbol}...")
df = fetch_data(symbol)
if df is not None:
best_params, best_performance, best_df = optimize_strategy(df)
# Get last position details
last_position_row = best_df[best_df['position'] != 0].iloc[-1]
last_entry_price = last_position_row['close']
last_position_date = last_position_row['timestamp']
upnl = ((best_df['close'].iloc[-1] - last_entry_price) / last_entry_price) * 100 # uPNL%
results.append({
'symbol': symbol,
'fast_ema': best_params[0],
'slow_ema': best_params[1],
'total_return': best_performance,
'last_position': 'Long' if last_position_row['position'] == 1 else 'Short' if last_position_row['position'] == -1 else 'None',
'last_entry_price': last_entry_price,
'last_position_date': last_position_date,
'upnl_percent': upnl
})
# Create results DataFrame
results_df = pd.DataFrame(results)
# Save and display the results
results_df.to_csv('optimized_strategy_results_with_upnl.csv', index=False)
Processing BTCIRT... Processing ETHIRT... Processing USDTIRT... Processing XRPIRT... Processing BNBIRT... Processing SOLIRT... Processing DOGEIRT... Processing USDCIRT... Processing STETHIRT... Error fetching data for STETHIRT: Unknown error Processing ADAIRT... Processing TRXIRT... Processing AVAXIRT... Processing TONIRT... Processing WSTETHIRT... Error fetching data for WSTETHIRT: Unknown error Processing LINKIRT... Processing SHIBIRT... Processing WBTCIRT... Processing SUIIRT... Error fetching data for SUIIRT: Unknown error Processing BGBIRT... Error fetching data for BGBIRT: Unknown error Processing XLMIRT...
پس از اجرای استراتژی معاملاتی مبتنی بر میانگین متحرک نمایی (EMA) برای چندین جفتارز، نتایج بهینهسازی در قالب جدول زیر ارائه شده است. این جدول شامل اطلاعاتی مانند بهترین پارامترهای EMA، سود نهایی استراتژی، وضعیت آخرین موقعیت معاملاتی، قیمت ورود به آخرین موقعیت، تاریخ ورود، و سود و زیان تحققنیافته (uPNL) برای هر نماد است.
---| نماد | EMA سریع | EMA کند | سود نهایی | آخرین موقعیت | قیمت ورود | تاریخ ورود | uPNL (%) |
|---|---|---|---|---|---|---|---|
| BTCIRT | 18 | 32 | 4.57 | لانگ | 7686514 | 2024-12-27 20:30:00 | -1.28 |
| ETHIRT | 18 | 24 | 1.68 | شورت | 267100 | 2024-12-27 20:30:00 | 0.00 |
این تحلیل بهینهسازی نشان میدهد که استفاده از EMA به عنوان یک ابزار برای تشخیص روند و بازگشت قیمتی میتواند عملکرد استراتژی معاملاتی را بهبود بخشد. کاربران میتوانند از این نتایج برای تنظیم بهتر استراتژیهای معاملاتی خود استفاده کنند.
results_df
| symbol | fast_ema | slow_ema | total_return | last_position | last_entry_price | last_position_date | upnl_percent | |
|---|---|---|---|---|---|---|---|---|
| 0 | BTCIRT | 18 | 32 | 4.913766 | Long | 7.686514e+09 | 2024-12-27 08:30:00 | -1.437296 |
| 1 | ETHIRT | 18 | 24 | 1.789513 | Short | 2.695520e+08 | 2024-12-28 02:30:00 | 0.000000 |
| 2 | USDTIRT | 18 | 20 | 0.943757 | Long | 8.099100e+04 | 2024-12-28 02:30:00 | 0.000000 |
| 3 | XRPIRT | 19 | 26 | 0.363152 | Short | 1.743000e+05 | 2024-12-28 02:30:00 | 0.000000 |
| 4 | BNBIRT | 18 | 48 | 0.777883 | Long | 5.630070e+07 | 2024-12-28 02:30:00 | 0.000000 |
| 5 | SOLIRT | 11 | 27 | 4.244247 | Short | 1.493091e+07 | 2024-12-28 02:30:00 | 0.000000 |
| 6 | DOGEIRT | 17 | 26 | 2.465710 | Short | 2.544120e+04 | 2024-12-28 02:30:00 | 0.000000 |
| 7 | USDCIRT | 18 | 24 | 0.277195 | Long | 8.124600e+04 | 2024-12-28 02:30:00 | 0.000000 |
| 8 | ADAIRT | 19 | 49 | 1.494216 | Short | 7.019000e+04 | 2024-12-28 02:30:00 | 0.000000 |
| 9 | TRXIRT | 15 | 39 | 2.087704 | Long | 2.089600e+04 | 2024-12-28 02:30:00 | 0.000000 |
| 10 | AVAXIRT | 19 | 48 | 4.050135 | Short | 2.943555e+06 | 2024-12-28 02:30:00 | 0.000000 |
| 11 | TONIRT | 18 | 22 | 0.534244 | Long | 4.577910e+05 | 2024-12-28 02:30:00 | 0.000000 |
| 12 | LINKIRT | 17 | 46 | 1.526282 | Short | 1.711000e+06 | 2024-12-28 02:30:00 | 0.000000 |
| 13 | SHIBIRT | 16 | 38 | 3.971439 | Short | 1.740300e+03 | 2024-12-28 02:30:00 | 0.000000 |
| 14 | WBTCIRT | 19 | 47 | 0.013966 | Long | 7.664621e+09 | 2024-12-27 20:30:00 | -0.734819 |
| 15 | XLMIRT | 18 | 29 | 1.310216 | Short | 2.800900e+04 | 2024-12-28 02:30:00 | 0.000000 |